#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
//成员访问
class Data{
public:
    Data()
    :_data(10)
    {

    }

    int getData() const{
        return _data;
    }

private:
    int _data;
};
//当前类中主要持有一个Data*指针数据成员
//但是指针数据成员并没有自己独立申请堆空间，而是采取的是浅拷贝
//析构函数进行资源的回收
class MiddleLayer{
public:
    MiddleLayer(Data * data)
    :_pdata(data)
    {
        cout << "MiddleLayer(Data *)" << endl;
    }
    ~MiddleLayer(){
        cout << "~MiddleLayer()" << endl;
        if(_pdata){
            delete _pdata;
            _pdata = nullptr;
        }
    }

    int func(){
        return _pdata->getData();
    }

private:
    Data * _pdata;
};
void test(){
    Data * pdata = new Data();
    int result = pdata->getData();
    cout << result << endl;
    delete pdata;
    pdata = nullptr;
}

void test2(){
    //有没有内存泄漏问题？？？？？？
    //只需要去new，并不需要去delete
    //这个其实就是后面最后一个章节中智能指针的雏形
    MiddleLayer ml(new Data());
    (*ml).getData();
    ml.func();
    //ml如何调用Data里面的成员函数呢？
}

void test3(){
    //回顾一下string的用法
    string s = "hello";
    //对s进行遍历
    //it可以把它当做指针去使用，但是它其实不是指针
    //不是指针为什么可以当指针去用呢？因为iterator重载了
    //箭头访问运算符以及解引用运算符
    //实际上调用*it，调用的是it.operator*();
    auto it = s.begin();
    while(it != s.end()){
        cout << *it << endl;
        ++it;
    }
}

void test4(){
    vector<Point> vec;
    auto it = vec.begin();
    it->print();
    (*it).print();
}

int main()
{
    test2();
    return 0;
}

